#pragma once
/*
 通⽤功能类，与业务⽆关的功能实现
 1. 获取系统时间
 2. 获取⽂件是否存在
 3. 获取⽂件所在⽬录
 4. 创建⽬录
*/
#include <iostream>
#include <ctime>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
namespace Log
{
    namespace util
    {
        class date
        {
        public:
            static size_t now()
            {
                //time_t 是一个 平台相关的类型，在不同操作系统/编译器上可能不同
                //强转成目的是为了让返回值是一个 平台统一、明确大小、无符号整数类型：
                return (size_t)time(nullptr);
            }
        };

        class file
        {
        public:
            static bool exists(const std::string &name)
            {
                // access stat 函数可以判断文件是否存在
                // 但是access是linux下系统调用接口 不具备可移植性
                struct stat st;
                return stat(name.c_str(), &st) == 0;
            }

            static std::string path(const std::string &name)
            {
                if (name.empty())
                    return ".";
                // 为了兼容不太的操作系统, 我们需要找到'/\'。
                // 但是\'是转义字符，我们需要用\\来表示
                size_t pos = name.find_last_of("/\\");
                if (pos == std::string::npos)
                    return ".";
                return name.substr(0, pos + 1);
            }

            static void create_directory(const std::string &name)
            {
                if (name.empty())
                    return;
                if (exists(name))
                    return;
                size_t pos = 0, idx = 0;
                while (idx < name.size())
                {
                    pos = name.find_first_of("/\\", idx);
                    if (pos == std::string::npos)
                    {
                        // "abc"   
                        //mkdir 函数不能创建普通文件，它的作用是创建目录（文件夹）
                        mkdir(name.c_str(), 0755);
                        return;
                    }

                    // "/abc/acd/aaa/"  当没有./ 的时候
                    if (pos == idx)
                    {
                        idx = pos + 1;
                        continue;
                    }

                    // "./abc/acd"
                    std::string subdir = name.substr(0, pos);
                    // 判断是否存在
                    if (exists(subdir))
                    {
                        idx = pos + 1;
                        continue;
                    }
                    mkdir(subdir.c_str(), 0755);
                    idx = pos + 1;
                }
            }
        };
    }
}



